package com.example.controller;


import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.example.result.Result;
import com.example.entity.Product;
import com.example.service.ProductService;
import com.example.vo.ProductVO;
import com.github.pagehelper.PageInfo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
//import javax.servlet.ServletOutputStream;
//import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.List;

@RestController
@Tag(name="商品信息相关接口")
@RequestMapping("/product")
public class ProductController {
    @Resource
    private ProductService productService;
    @Operation(summary = "发布商品",description="新增一条商品信息,商品状态在默认时1，可不用传入")
    @PostMapping("/add")
    public Result add(@RequestBody Product product){
        productService.add(product);
        return Result.success();
    }

    @Operation(summary = "修改商品信息",description="修改商品的相关信息")
    @PutMapping("/update")
    public Result update(@RequestBody Product product){
        productService.updateById(product);
        return Result.success();
    }

    @Operation(summary = "删除商品",description="根据商品id删除商品的信息")
    @DeleteMapping("/delete/{id}")
    public Result delete(@PathVariable Integer id ){
        productService.deleteById(id);
        return Result.success();
    }

    @Operation(summary = "冻结商品",description="根据商品id冻结商品")
    @PutMapping("/freezeById/{id}")
    public Result freezeById(@PathVariable Integer id ){
        productService.freezeById(id);
        return Result.success();
    }

    /**
     * 根据id查询商品信息的时候，查到商品的基本信息以及商铺的ID、头像、名称
     * @param id
     * @return
     */
    @Operation(summary = "根据id查询商品信息",description="根据商品id查询商品信息")
    @GetMapping("/selectById/{id}")
    public Result selectById(@PathVariable Integer id){
        ProductVO product = productService.selectById(id);
        return Result.success(product);
    }

    /**
     * 分页查询商品信息/根据商品名称查询商品,查到商品的基本信息以及商铺的ID、头像、名称
     * @param product
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Operation(summary = "分页查询商品信息/根据商品名称查询商品",description="分页查询商品信息/根据商品名称查询商品")
    @GetMapping("/selectPage")
    public Result selectPage (ProductVO product,
                              @RequestParam (defaultValue = "1") Integer pageNum ,
                              @RequestParam(defaultValue = "10") Integer pageSize) {
        PageInfo<ProductVO> pageInfo= productService.selectPage(product,pageNum,pageSize) ;
        return Result.success(pageInfo);
    }

    /**
     * 商家分页查询商品信息/根据商品名称查询自己的商品,查到商品的基本信息以及商铺的ID、头像、名称!!!区别：这里是商家只能查到自己发布的商品
     * @param product
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Operation(summary = "商家分页查询商品信息/根据商品名称查询商品",description="分页查询商品信息/根据商品名称查询商品")
    @GetMapping("/selectPage/{sId}")
    public Result selectPageByMerchant (@PathVariable Integer sId, ProductVO product,
                              @RequestParam (defaultValue = "1") Integer pageNum ,
                              @RequestParam(defaultValue = "10") Integer pageSize) {
        PageInfo<ProductVO> pageInfo= productService.selectPageByMerchant(sId,product,pageNum,pageSize) ;
        return Result.success(pageInfo);
    }

    /**
     * 查询所有商品信息（包括上架或者未上架）
     * @param product
     * @return
     */
    @Operation(summary = "查询所有商品信息",description="查询所有商品信息")
    @GetMapping("/selectAll")
    public Result<List<ProductVO>> selectAll(ProductVO product){
        List<ProductVO> list = productService.selectAll(product);
        return Result.success(list);
    }

    /**
     * 商家查看历史商品信息
     * @return
     */
    @Operation(summary = "查看历史商品信息",description="查看历史商品信息")
    @GetMapping("/selectHistory/{sId}")
    public Result<List<ProductVO>> selectHistory(@PathVariable Integer sId){
        List<ProductVO> productList = productService.selectHistory(sId);
        return Result.success(productList);
    }

    /**
     * 买家查看所有商家商品信息
     * @return
     */
    @Operation(summary = "查看上架商品信息",description="查看上架商品信息")
    @GetMapping("/listedProduct")
    public Result<List<ProductVO>> listedProduct(){
        List<ProductVO> productList = productService.listedProduct();
        return Result.success(productList);
    }





    /**
     *excel导入
     */
    @Operation(summary = "批量导入商品信息",description="可以通过选择excell表格将多条商品信息同时导入")
    @PostMapping("/import")
    public Result importData(MultipartFile file) throws Exception {
        //1.拿到输入流 构建reader
        InputStream inputstream = file.getInputStream();
        ExcelReader reader = ExcelUtil.getReader(inputstream);
        //2.读取excell数据
        //设置别名跟中文表头对应上
        reader.addHeaderAlias("商品名称","name");
        reader.addHeaderAlias("商品图片","imagePath");
        reader.addHeaderAlias("商品描述","description");
        reader.addHeaderAlias("价格","price");
        reader.addHeaderAlias("状态","state");
        reader.addHeaderAlias("类别","category");
        reader.addHeaderAlias("库存","stock");
        List<Product> productList=reader.readAll(Product.class);
        //3.写入list数据到数据库里

        //通过 javabean的方式读取Excel内的对象，但是要求表头必须是英文，跟javabean的属性要对应起
        //
        for (Product product : productList){
            productService.add(product);
        }
        //调用插入数据方法插入数据
        return Result. success();
    }
}
